package ar.edu.utn.frsf.tpae.a2013.g03.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.CentroCostoDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.EmpleadoDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.GastoDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.SolicitudGastoDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.dao.SupervisorDao;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Gasto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.SolicitudGasto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Supervisor;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.utilities.Constantes;
import ar.edu.utn.frsf.tpae.a2013.g03.service.SupervisorService;

public class SupervisorServiceImpl implements SupervisorService {

	private SupervisorDao supervisorDao;
	private SolicitudGastoDao solicitudDao;
	private GastoDao gastoDao;
	private CentroCostoDao centroCostoDao;
	private EmpleadoDao empleadoDao;

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setsupervisorDao(SupervisorDao supervisorDao) {
		this.supervisorDao = supervisorDao;
	}

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setEmpleadoDao(EmpleadoDao empleadoDao) {
		this.empleadoDao = empleadoDao;
	}

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setGastoDao(GastoDao gastoDao) {
		this.gastoDao = gastoDao;
	}

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setSolicitudDao(SolicitudGastoDao solicitudDao) {
		this.solicitudDao = solicitudDao;
	}

	// Setter utilizado por Spring.
	@Autowired(required = true)
	public void setCentroCostoDao(CentroCostoDao centroCostoDao) {
		this.centroCostoDao = centroCostoDao;
	}

	@Override
	public Supervisor iniciarSesion(String user, String pass) {
		Supervisor supervisor = supervisorDao.buscarPorUsuario(user);
		if (supervisor != null)
			if (supervisor.getContrasenia().equals(pass)
					&& supervisor.getUsuario().equals(user))
				return supervisor;

		return null;
	}

	@Override
	public List<SolicitudGasto> administrarSolicitudes(Supervisor supervisor,
			String estado) {
		List<SolicitudGasto> solicitudes = solicitudDao
				.listarPorSupervisorYEstado(supervisor, estado);
		return solicitudes;

	}

	@Override
	public List<SolicitudGasto> administrarSolicitudes(String estado) {
		List<SolicitudGasto> solicitudes = solicitudDao.listarPorEstado(estado);
		return solicitudes;

	}

	@Override
    public SolicitudGasto aprobarSolicitud(SolicitudGasto solicitud) {
            if (solicitud.getEstado().equals(Constantes.PENDIENTE))
                    solicitudDao.cambiarEstado(solicitud, Constantes.APROBADA);
            return solicitud;
    }

    @Override
    public SolicitudGasto rechazarSolicitud(SolicitudGasto solicitud) {
            if (solicitud.getEstado().equals(Constantes.PENDIENTE))
                    solicitudDao.cambiarEstado(solicitud, Constantes.RECHAZADA);
            return solicitud;
    }

	// Este servicio no anda!
	@Override
	public List<Gasto> consultarGastos(Supervisor supervisor) {
		List<Gasto> gastos = gastoDao.listarPorSupervisor(supervisor);

		return gastos;
	}

	@Override
	public List<Gasto> consultarGastos(CentroCosto centroCosto,
			Empleado empleado) {
		List<Gasto> gastos;
		
		if(empleado != null & centroCosto != null)
			gastos = gastoDao.listarPorCentroCostoYEmpleado(centroCosto, empleado);
		
		else if(empleado != null)
			gastos = gastoDao.listarPorEmpleado(empleado);
		
		else if(centroCosto != null)
			gastos = gastoDao.listarPorCentroCosto(centroCosto);
		
		else
			gastos = gastoDao.listar();

		return gastos;
	}

	@Override
	public SolicitudGasto obtenerSolicitud(SolicitudGasto solicitud) {
		return solicitudDao.buscarPorId(solicitud.getIdSolicitudGasto());
	}

	@Override
	public List<CentroCosto> listarCentrosCosto() {
		return centroCostoDao.listar();
	}

	@Override
	public List<SolicitudGasto> listarSolicitudes(String estado) {
		return solicitudDao.listarPorEstado(estado);
	}

	@Override
	public List<Empleado> listarEmpleados() {
		return empleadoDao.listar();
	}

}
